home *** CD-ROM | disk | FTP | other *** search
/ Programming Languages Suite / ProgramD2.iso / Borland / Borland C++ V5.02 / CHKBOOK.PAK / CHECKDOC.CPP < prev    next >
C/C++ Source or Header  |  1997-05-06  |  8KB  |  310 lines

  1. // checkdoc.cpp : implementation of the CChkBookDoc class
  2. //
  3. // This is a part of the Microsoft Foundation Classes C++ library.
  4. // Copyright (C) 1992-1995 Microsoft Corporation
  5. // All rights reserved.
  6. //
  7. // This source code is only intended as a supplement to the
  8. // Microsoft Foundation Classes Reference and related
  9. // electronic documentation provided with the library.
  10. // See these sources for detailed information regarding the
  11. // Microsoft Foundation Classes product.
  12.  
  13.  
  14. #include "stdafx.h"
  15. #include "chkbook.h"
  16.  
  17. #ifdef _DEBUG
  18. #undef THIS_FILE
  19. static char BASED_CODE THIS_FILE[] = __FILE__;
  20. #endif
  21.  
  22. #define FIRST_CHECK_NO 101
  23. #define CHECK_BOOK_FILE_SIGNATURE 0xd6f7e471
  24.  
  25. /////////////////////////////////////////////////////////////////////////////
  26. // CChkBookDoc
  27. //
  28.  
  29. IMPLEMENT_DYNCREATE(CChkBookDoc, CFixedLenRecDoc)
  30.  
  31. BEGIN_MESSAGE_MAP(CChkBookDoc, CFixedLenRecDoc)
  32.     //{{AFX_MSG_MAP(CChkBookDoc)
  33.     ON_COMMAND(ID_EDIT_NEW_CHECK, NewCheck)
  34.     ON_COMMAND(ID_NEXT_CHECK, OnNextCheck)
  35.     ON_UPDATE_COMMAND_UI(ID_NEXT_CHECK, OnUpdateNextCheck)
  36.     ON_COMMAND(ID_PREV_CHECK, OnPrevCheck)
  37.     ON_UPDATE_COMMAND_UI(ID_PREV_CHECK, OnUpdatePrevCheck)
  38.     //}}AFX_MSG_MAP
  39. END_MESSAGE_MAP()
  40.  
  41. /////////////////////////////////////////////////////////////////////////////
  42. // CChkBookDoc construction/destruction
  43.  
  44. CChkBookDoc::CChkBookDoc()
  45. {
  46.     m_header.nRecordLength = sizeof(m_record);
  47.     m_header.nExtraHeaderLength = sizeof(m_extraHeader);
  48.     m_header.nRecordCount = 0;
  49.     m_nActiveRecord = 0;
  50.     m_extraHeader.nFirstCheckNo = FIRST_CHECK_NO;
  51.     m_extraHeader.dwFileSignature = CHECK_BOOK_FILE_SIGNATURE;
  52. #ifdef _UNICODE
  53.     m_extraHeader.bUnicode = TRUE;
  54. #else
  55.     m_extraHeader.bUnicode = FALSE;
  56. #endif
  57. }
  58.  
  59. CChkBookDoc::~CChkBookDoc()
  60. {
  61. }
  62.  
  63. /////////////////////////////////////////////////////////////////////////////
  64. // Overrides of CFixedLenRecDoc and CDocument
  65.  
  66. BOOL CChkBookDoc::OnOpenDocument(LPCTSTR lpszPathName)
  67. {
  68.     // Upon opening the document, tell the application object
  69.     // to save the path name in the private INI file.
  70.  
  71.     if (!CFixedLenRecDoc::OnOpenDocument(lpszPathName))
  72.         return FALSE;
  73.     UpdateIniFileWithDocPath(lpszPathName);
  74.     m_nActiveRecord = 0;
  75.     return TRUE;
  76. }
  77.  
  78. BOOL CChkBookDoc::OnSaveDocument(LPCTSTR lpszPathName)
  79. {
  80.     // Upon saving the document, tell the application object
  81.     // to save the path name in the private INI file.
  82.  
  83.     if (!CFixedLenRecDoc::OnSaveDocument(lpszPathName))
  84.         return FALSE;
  85.     UpdateIniFileWithDocPath(lpszPathName);
  86.     return TRUE;
  87. }
  88.  
  89. BOOL CChkBookDoc::SaveModified()
  90. {
  91.     // If the user has been editing a check in the check view
  92.     // but hasn't commited it yet, ask her whether she wants to
  93.     // commit the check.  She might response with 'Cancel', in
  94.     // which case MaybeCommitDirtyCheck() returns FALSE, which
  95.     // SaveModified() in turn returns to cancel the File Close.
  96.  
  97.     return MaybeCommitDirtyCheck();
  98. }
  99.  
  100. void CChkBookDoc::UpdateIniFileWithDocPath(LPCTSTR lpszPathName)
  101. {
  102.     theApp.UpdateIniFileWithDocPath(lpszPathName);
  103. }
  104.  
  105. void* CChkBookDoc::OnCreateNewRecord(int nNewRecordIndex)
  106. {
  107.     // The base class CFixedLenRecDoc calls this override to
  108.     // format a new record (in memory).
  109.  
  110.     DWORD dwCents = 0L;
  111.     TCHAR date[9];
  112.     _tstrdate(date);
  113.     CString strDate(date);
  114.     CString strPayTo;
  115.     CString strMemo;
  116.     PackRecord(dwCents, strPayTo, strDate, strMemo);
  117.     m_nActiveRecord = nNewRecordIndex;
  118.     return &m_record;
  119. }
  120.  
  121. BOOL CChkBookDoc::OnReadExtraHeader()
  122. {
  123.     // Read the ChkBook-specific portion of the file header,
  124.     // and verify the file signature to make sure we're not
  125.     // reading a non-ChkBook file.
  126.  
  127.     if (m_file.Read(&m_extraHeader, sizeof(m_extraHeader))
  128.         < sizeof(m_extraHeader))
  129.         return FALSE;
  130. #ifdef _UNICODE
  131.     if (!m_extraHeader.bUnicode)
  132.     {
  133.         AfxMessageBox(IDS_CANNOT_READ_UNICODE_FILE);
  134.         return FALSE;
  135.     }
  136. #else
  137.     if (m_extraHeader.bUnicode)
  138.     {
  139.         AfxMessageBox(IDS_CANNOT_READ_ANSI_FILE);
  140.         return FALSE;
  141.     }
  142. #endif
  143.     return (m_extraHeader.dwFileSignature == CHECK_BOOK_FILE_SIGNATURE);
  144. }
  145.  
  146. void CChkBookDoc::OnWriteExtraHeader(BOOL bNewHeader)
  147. {
  148.     m_file.Write(&m_extraHeader, sizeof(m_extraHeader));
  149.  
  150.     // If this is a new header (that is, if the first is first being
  151.     // created), then create the first record.
  152.  
  153.     if (bNewHeader)
  154.         CreateNewRecord();
  155.  
  156. }
  157.  
  158. /////////////////////////////////////////////////////////////////////////////
  159. // Operations, called by book view and check view
  160.  
  161. void CChkBookDoc::GetCheck(UINT nCheckNo, DWORD& dwCents, CString& strPayTo,
  162.         CString& strDate, CString& strMemo)
  163. {
  164.     UINT nRecord = CheckNoToRecordIndex(nCheckNo);
  165.     GetRecord(nRecord, &m_record);
  166.     ParseRecord(dwCents, strPayTo, strDate, strMemo);
  167. }
  168.  
  169.  
  170. void CChkBookDoc::UpdateCheck(CView* pSourceView, UINT nCheckNo,
  171.         DWORD dwCents, LPCTSTR lpszPayTo, LPCTSTR lpszDate,
  172.         LPCTSTR lpszMemo)
  173. {
  174.     UINT nRecord = CheckNoToRecordIndex(nCheckNo);
  175.     PackRecord(dwCents, lpszPayTo, lpszDate, lpszMemo);
  176.     UpdateRecord(pSourceView, nRecord, &m_record);
  177.     ASSERT_VALID(GetDocTemplate());
  178. }
  179.  
  180.  
  181. void CChkBookDoc::ChangeSelectionNextCheckNo(BOOL bNext)
  182. {
  183.     if (bNext)
  184.     {
  185.         if (m_nActiveRecord < (GetRecordCount() - 1))
  186.         {
  187.             if (!MaybeCommitDirtyCheck())
  188.                 return;
  189.             UpdateAllViewsWithRecord(NULL, ++m_nActiveRecord);
  190.         }
  191.     }
  192.     else
  193.     {
  194.         if (m_nActiveRecord > 0)
  195.         {
  196.             if (!MaybeCommitDirtyCheck())
  197.                 return;
  198.             UpdateAllViewsWithRecord(NULL, --m_nActiveRecord);
  199.         }
  200.     }
  201. }
  202.  
  203. void CChkBookDoc::ChangeSelectionToCheckNo(UINT nNewActiveCheckNo)
  204. {
  205.     if (!MaybeCommitDirtyCheck())
  206.         return;
  207.     m_nActiveRecord = CheckNoToRecordIndex(nNewActiveCheckNo);
  208.     UpdateAllViewsWithRecord(NULL, m_nActiveRecord);
  209. }
  210.  
  211. BOOL CChkBookDoc::MaybeCommitDirtyCheck()
  212. {
  213.     CView* pView;
  214.     POSITION pos = GetFirstViewPosition();
  215.     while (pos != NULL)
  216.     {
  217.         pView = GetNextView(pos);
  218.         CCheckView* pCheckView = DYNAMIC_DOWNCAST(CCheckView, pView);
  219.         if (pCheckView != NULL)
  220.             return pCheckView->MaybeCommitDirtyCheck();
  221.     }
  222.     return TRUE;
  223. }
  224.  
  225. /////////////////////////////////////////////////////////////////////////////
  226. // Implementation
  227.  
  228. void CChkBookDoc::PackRecord(DWORD dwCents, LPCTSTR lpszPayTo,
  229.             LPCTSTR lpszDate, LPCTSTR lpszMemo)
  230. {
  231.     m_record.dwCents = dwCents;
  232.     _tcsncpy(m_record.szPayTo, lpszPayTo, sizeof(m_record.szPayTo)/sizeof(TCHAR) - 1);
  233.     m_record.szPayTo[sizeof(m_record.szPayTo)/sizeof(TCHAR) - 1] = 0;
  234.     _tcsncpy(m_record.szDate, lpszDate, sizeof(m_record.szDate)/sizeof(TCHAR) - 1);
  235.     m_record.szDate[sizeof(m_record.szDate)/sizeof(TCHAR) - 1] = 0;
  236.     _tcsncpy(m_record.szMemo, lpszMemo, sizeof(m_record.szMemo)/sizeof(TCHAR) - 1);
  237.     m_record.szMemo[sizeof(m_record.szMemo)/sizeof(TCHAR) - 1] = 0;
  238.  
  239. }
  240.  
  241. void CChkBookDoc::ParseRecord(DWORD& dwCents, CString& strPayTo,
  242.             CString& strDate, CString& strMemo)
  243. {
  244.     dwCents = m_record.dwCents;
  245.     strPayTo = m_record.szPayTo;
  246.     strDate = m_record.szDate;
  247.     strMemo = m_record.szMemo;
  248. }
  249.  
  250. UINT CChkBookDoc::CheckNoToRecordIndex(UINT nCheckNo)
  251. {
  252.     return (nCheckNo - m_extraHeader.nFirstCheckNo);
  253. }
  254.  
  255. UINT CChkBookDoc::RecordIndexToCheckNo(UINT nRecordIndex)
  256. {
  257.     return (nRecordIndex + m_extraHeader.nFirstCheckNo);
  258. }
  259.  
  260. UINT CChkBookDoc::GetActiveCheckNo()
  261. {
  262.     return (m_nActiveRecord + m_extraHeader.nFirstCheckNo);
  263. }
  264.  
  265. UINT CChkBookDoc::GetFirstCheckNo()
  266. {
  267.     return m_extraHeader.nFirstCheckNo;
  268. }
  269.  
  270. UINT CChkBookDoc::GetLastCheckNo()
  271. {
  272.     return (m_extraHeader.nFirstCheckNo + GetRecordCount() - 1);
  273. }
  274.  
  275. /////////////////////////////////////////////////////////////////////////////
  276. // CChkBookDoc commands
  277.  
  278. void CChkBookDoc::NewCheck()
  279. {
  280.     // Before creating a new record, which will become the new selection,
  281.     // ask the user whether she wants to commit data entered in the
  282.     // check view for the previously selected check.
  283.  
  284.     if (!MaybeCommitDirtyCheck())
  285.         return;
  286.  
  287.     m_nActiveRecord = CreateNewRecord();
  288. }
  289.  
  290. void CChkBookDoc::OnNextCheck()
  291. {
  292.     ChangeSelectionNextCheckNo(TRUE);
  293. }
  294.  
  295. void CChkBookDoc::OnUpdateNextCheck(CCmdUI* pCmdUI)
  296. {
  297.     pCmdUI->Enable(m_nActiveRecord < (GetRecordCount() - 1));
  298. }
  299.  
  300. void CChkBookDoc::OnPrevCheck()
  301. {
  302.     ChangeSelectionNextCheckNo(FALSE);
  303. }
  304.  
  305. void CChkBookDoc::OnUpdatePrevCheck(CCmdUI* pCmdUI)
  306. {
  307.     pCmdUI->Enable(m_nActiveRecord > 0);
  308.  
  309. }
  310.